接下來要介紹最令我頭痛的暫存器,8086 的 CPU 有 14 個暫存器,分別是:
AX、BX、CX、DX、SI、DI、SP、BP、IP、CS、SS、DS、ES、PSW。
暫存器很特別只有組合語言有,其他高階語言都不會涉及暫存器,暫存器用於 CPU 運算過程中的資料暫存,例如想將 10 和 20 相加,必需先將 10 放入 AX,20 放入 BX,再透過 CPU 運算器將暫存器相加後得到結果,暫存器種類很多每種都有不同的功能,這裡先有個概念就好之後會再慢慢和大家介紹。
14 個暫存器中有 8 個通用暫存器,其中 AX、BX、CX、DX 用於存放一般性的數據,這四個通用暫存器都是 16 位元,不過為了相容上一代 8 位元的 CPU,每個都可分為高位和低位兩個 8 位元的暫存器使用,例如 AX 是由高位 AH
和低位 AL
組成。
示意圖:
假設現在 AX 中存放的數據是。
0 1 1 1 1 0 0 0 0 1 0 1 1 0 0 0
這時 AH、AL、AX 分別表示:
120
88
30808
高位和低位暫存器可以分開來,也可以合在一起使用。
組合語言的指令不分大小寫,和常見的高階語言不一樣。
mov ax, 10
; 等於
MOV AX, 10
接著介紹 mov 和 add 指令,mov 用於賦值,add 用於加法運算,這兩個指令都很常用到。
mov ax, 10 ; 將 10 放進 ax 暫存器中
add ax, 20 ; 將 ax 傳存器加上 20
mov 指令就類似高階語言的 =
,add 指令類似 +=
,可以將上面的例子看成。
ax = 10
ax = ax + 20
一個 16 位暫存器最大只能存放 FFFF,那如果超過了會發生什麼事,例如下列兩行指令,執行後 ax 暫存器的結果是什麼。
mov ax, FFFF
add ax, 1
答案是 0
,當數值超過暫存器的上限,就會發生 溢位
,FFFF + 1 = 10000 CPU 會將 1 捨棄,只保留後面四位,所以答案是 0。
暫存器是組合語言的核心,也是我覺得組合語言最難學的地方,相信很多想學的人都是在這被嚇跑的,一開始看到那一堆的暫存器和指令,頭腦真的轉不過來,重複看好幾次腦中才慢慢有概念,組合語言要思考的面向比高階語言更多,常常需要繞好幾個彎才能完成一個簡單的運算,本系列文章希望寫的淺顯易懂,讓有心學習卻不得其門而入的人能跨過這一關,不知道大家吸收得如何?
今天就到這裡摟,感謝大家觀看。